package es.cazadoresmadridejos.beans.manager.biggame.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.displaytag.pagination.PaginatedList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import es.cazadoresmadridejos.beans.dao.biggame.BigGameDao;
import es.cazadoresmadridejos.beans.manager.biggame.BigGameManager;
import es.cazadoresmadridejos.beans.manager.log.LogManager;
import es.cazadoresmadridejos.beans.manager.partner.PartnerManager;
import es.cazadoresmadridejos.beans.manager.temps.TempsManager;
import es.cazadoresmadridejos.common.bean.dao.Dao;
import es.cazadoresmadridejos.common.bean.manager.impl.ManagerImpl;
import es.cazadoresmadridejos.model.BigGame;
import es.cazadoresmadridejos.model.BigGame.BigGameStatus;
import es.cazadoresmadridejos.model.BigGameAssistance;
import es.cazadoresmadridejos.model.Log;
import es.cazadoresmadridejos.model.Partner;
import es.cazadoresmadridejos.model.Partner.Role;
import es.cazadoresmadridejos.model.Temps;
import es.cazadoresmadridejos.objs.web.Page;
import es.cazadoresmadridejos.util.BaseEntityUtils;

@Service
public class BigGameManagerImpl extends ManagerImpl<BigGame> 
	implements BigGameManager{

	@Autowired private TempsManager tempsManager;
	@Autowired private PartnerManager partnerManager;
	@Autowired private LogManager logManager;
	
	@Autowired 
	public void setDao(@Qualifier("bigGameDao")
	Dao<BigGame> dao) {
		this.dao = dao;
	}

	@Override
	public PaginatedList findAllPaginated(Page page, Long year) {
		return ((BigGameDao)dao).findAllPaginated(page,year);
	}

	@Override
	public BigGame getInProgressBigGame() {
		return ((BigGameDao)dao).getInProgressBigGame();
	}

	
	
	@Override
	public Long save(BigGame bigGame) {
		//Actualizar la variable temporal
		if(BigGameStatus.CERRADA.equals(bigGame.getStatus())){
			Map<Long, BigGameAssistance> map = (Map<Long, BigGameAssistance>) BaseEntityUtils.listToMap(bigGame.getAssistances());
			
			Temps temps = tempsManager.getByKey(Temps.BIG_GAME_ORDER);
			
			List<Role> roles = new ArrayList<Role>();
			roles.add(Role.CAZADOR);
			roles.add(Role.JUNTA);
			
			Map<String,Integer> info = partnerManager.bigGameInfo(temps.getNumeric(), bigGame.getStands(), roles);
			Integer directivesToAdd = info.get("directives");
			Integer partnersOfPartners = info.get("partners");
			
			Integer count = partnerManager.getCountOfBigGameAssistances();
			Integer newTemp = (temps.getNumeric() + bigGame.getStands() + directivesToAdd + partnersOfPartners) % count;
			
			StringBuilder text = new StringBuilder();
			text.append("INFO: Cerrando la montería con id: ")
			.append("[" + bigGame.getId() + "]; El valor del temporal anterior era: " + temps.getNumeric() + " y quedará modificado a ")
			.append(newTemp + " desplazando a " + directivesToAdd + " de la junta. " +  partnersOfPartners+  " Socios han sido desplazados ")
			.append(" porque le ha tocado a su compañero. Los puestos de la montería son: " + bigGame.getStands())
			.append("");
			
			Log log = new Log();
			log.setText(text.toString());
			log.setDate(new Date());
			
			logManager.save(log);
			
			temps.setNumeric(newTemp);
			temps.setValue(newTemp.toString());
			
			tempsManager.save(temps);
		}
		if(BigGameStatus.ABIERTA.equals(bigGame.getStatus())
				&& !bigGame.getAssistances().isEmpty()){
			bigGame.setStatus(BigGameStatus.EN_PROCESO);
		}
		
		return super.save(bigGame);
	}

	@Override
	public List<BigGame> findAll(Long reasonId) {
		return ((BigGameDao)dao).findAll(reasonId);
	}
}
